add --target flag support to cargo doc
authorJorge Aparicio <japaricious@gmail.com>
Thu, 26 Mar 2015 02:06:18 +0000 (21:06 -0500)
committerJorge Aparicio <japaricious@gmail.com>
Thu, 26 Mar 2015 02:58:17 +0000 (21:58 -0500)
closes #1427

src/bin/doc.rs
src/cargo/ops/cargo_rustc/mod.rs
tests/test_cargo_doc.rs

index 6524ff52dbcb0180d3575fc6d6e1f5368d9590db..ed05f9f55b326530065815a8a78cda26e574c6bb 100644 (file)
@@ -4,6 +4,7 @@ use cargo::util::important_paths::{find_root_manifest_for_cwd};
 
 #[derive(RustcDecodable)]
 struct Options {
+    flag_target: Option<String>,
     flag_features: Vec<String>,
     flag_jobs: Option<u32>,
     flag_manifest_path: Option<String>,
@@ -28,6 +29,7 @@ Options:
     -j N, --jobs N           The number of jobs to run in parallel
     --features FEATURES      Space-separated list of features to also build
     --no-default-features    Do not build the `default` feature
+    --target TRIPLE          Build for the target triple
     --manifest-path PATH     Path to the manifest to document
     -v, --verbose            Use verbose output
 
@@ -50,7 +52,7 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
         compile_opts: ops::CompileOptions {
             config: config,
             jobs: options.flag_jobs,
-            target: None,
+            target: options.flag_target.as_ref().map(|t| &t[..]),
             features: &options.flag_features,
             no_default_features: options.flag_no_default_features,
             spec: options.flag_package.as_ref().map(|s| &s[..]),
index 542eeb1236ec6bbfeb662d7216d89b02911ad970..bf0cadb6cb5493eacc2c99e6a6c88d50aade7a27 100644 (file)
@@ -495,14 +495,21 @@ fn prepare_rustc(package: &Package, target: &Target, profile: &Profile,
 fn rustdoc(package: &Package, target: &Target, profile: &Profile,
            cx: &mut Context) -> CargoResult<Work> {
     let kind = Kind::Target;
-    let cx_root = cx.get_package(cx.resolve.root()).absolute_target_dir()
-                    .join("doc");
+    let mut doc_dir = cx.get_package(cx.resolve.root()).absolute_target_dir();
     let mut rustdoc = try!(process(CommandType::Rustdoc, package, target, cx));
     rustdoc.arg(&root_path(cx, package, target))
            .cwd(cx.config.cwd())
-           .arg("-o").arg(&cx_root)
            .arg("--crate-name").arg(&target.crate_name());
 
+    if let Some(target) = cx.requested_target() {
+        rustdoc.arg("--target").arg(target);
+        doc_dir.push(target);
+    }
+
+    doc_dir.push("doc");
+
+    rustdoc.arg("-o").arg(&doc_dir);
+
     match cx.resolve.features(package.package_id()) {
         Some(features) => {
             for feat in features {
index 8f0c23ce66abf859f1d03b9664b01bad8fa48f63..fe064717965c1a202a59af9af4744683257201f3 100644 (file)
@@ -262,3 +262,28 @@ test!(doc_same_name {
     assert_that(p.cargo_process("doc"),
                 execs().with_status(0));
 });
+
+test!(doc_target {
+    const TARGET: &'static str = "arm-unknown-linux-gnueabihf";
+
+    let p = project("foo")
+        .file("Cargo.toml", r#"
+            [package]
+            name = "foo"
+            version = "0.0.1"
+            authors = []
+        "#)
+        .file("src/lib.rs", r#"
+            #![feature(no_std)]
+            #![no_std]
+
+            extern {
+                pub static A: u32;
+            }
+        "#);
+
+    assert_that(p.cargo_process("doc").arg("--target").arg(TARGET).arg("--verbose"),
+                execs().with_status(0));
+    assert_that(&p.root().join(&format!("target/{}/doc", TARGET)), existing_dir());
+    assert_that(&p.root().join(&format!("target/{}/doc/foo/index.html", TARGET)), existing_file());
+});